#define  _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>


//1 qsort排序函数的使用


//库函数库里面qsort的定义，放在库里面存在的，再来就重定义了
//void qsort(void* base //排序数组的首元素地址  //void*决定了对什么类型的数组都能来排
//	, size_t num //排序数组的元素个数
//	, size_t size //排序数组单个元素的字节大小
//	, int(*cmp)(const void*, const void*)) //小雏形比较函数的指针变量
//{
//
//}


//#include<stdlib.h>
//#include<string.h>
//struct stu//结构体类型外面定义的，全局都可以用，当然也要放前面
//{
//	char name[20];
//	int age;
//};
//
//
////用结构体里的整型成员排序结构体数组的小雏形函数
                     //传正就交换,它排右,它排左
//int small_compare_age(const void* p1, const void* p2)//直接顺着减是升序
//{
//	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
//}      //((struct stu*)p2)->age - ((struct stu*)p1)->age -->即逆序
//void text3()//按年龄排序排序结构体数组
//{
//	struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
//	int num = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, num, sizeof(arr[0]), small_compare_age);
//}
//
//
////qsort比较字符数组的小雏形函数
//int small_compare_name(const void*p1, const void*p2)
//{
//	return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);
//}
//void text2()//按结构体数组里的名字排序结构体数组
//{//arr数组里的元素是结构体类型的数值,类似于数组装
//	struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
//	int num = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, num, sizeof(arr[0]), small_compare_name);
//}
//
//
//void print(int* arr, int num)
//{
//	int i = 0;
//	for (i = 0;i < num;i++)
//	{
//		printf("%d ", *(arr + i));
//	}
//}
////小雏形比较函数(整型数组)
//int small_compare_int(const void* p1, const void* p2)
//{
//	if (*(int*)p1 > *(int*)p2)
//		return 1;
//	else if (*(int*)p1 < *(int*)p2)
//		return -1;
//	else return 0;
//
//	//or直接
//	return (*(int*)p1 - *(int*)p2);
//}
//void text1()//整型数组排序
//{
//	int arr[10] = { 3,4,2,5,7,6,8,10,1,9 };
//	int num = sizeof(arr) / sizeof(arr[0]);
//	qsort(arr, num, sizeof(arr[0]), small_compare_int);
//	print(arr, num);
//}
//int main()
//{
//	text1();
//	text2();
//	text3();
//	return 0;
//}


//2 qsort函数的模拟实现


//void printf_arr(int* p, size_t sz)
//{
//    for (int i = 0;i < sz;i++)
//    {
//        printf("%d ", *(p + i));
//    }
//}
//
////也是用char*配合字节大小所有类型的元素都能交换
//void Swap(char* buf1, char* buf2, size_t width)
//{
//    int i = 0;
//    char tmp = 0;
//    for (i = 0;i < width;i++)
//    {
//        tmp = *buf1;
//        *buf1 = *buf2;//交换时片片字节交换，小雏形那边比较就得要整全的
//        *buf2 = tmp;
//        buf1++;
//        buf2++;
//    }
//}
//
////海纳百川的实现排序的函数             //形参这边相当于一次创建好变量正常能用来
//void bubble_sort(void* base, size_t width, size_t sz, int(*cmp)(const void* p1, const void* p2))
//{              //全部都能接
//    int i = 0;
//    //趟数
//    for (i = 0;i < sz - 1;i++)
//    {
//        int j = 0;
//    //一趟内部的两两比较
//        for (j = 0;j < sz - 1 - i;j++)
//        {
//            //比较两个元素
//            //if (arr[j] > arr[j + 1])
//            
//            //首元素地址、char*配合变量字节宽度什么类型的变量地址头都能找到
//            //接了全部都能正确转
//
//            //必须要有这个载体承一下因为做这个函数时小雏形函数还没有，要做一个所有小雏形函数都能收的接待状态，外部的小雏形函数是自己添上去后才有的，在添上去之前就要对所有可能添的情况做到都能广泛接收处理，做到泛型接收所有小雏形函数
//            if (cmp((char*)base + j * width, (char*)base + (j + 1) * width)>0)//回调函数广泛函数指针地址接收类函数、处理类函数，做到泛型
//
//                //自地自做自的假想有的
//            {
//                //交换两个元素
//                Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
//            }
//        }
//    }
//}
//
////此整型数组的自己需添的小雏形比较函数
//      //传来的都是字符类型的地址反正后面都要强转能接到怎么接都行
//int cmp_int(const void* p1, const void* p2)
//{
//    return (*(int*)p1 - *(int*)p2);//对不同类型数组的排序改{}这里就行了
//}
//
//void text4()
//{
//    int arr[] = { 3,1,7,9,4,2,6,5,8,0 };
//    int sz = sizeof(arr) / sizeof(arr[0]);//调小雏形函数它内部就可改成别的类型的排序了
//    bubble_sort(arr, sizeof(arr[0]), sz, cmp_int);
//    //调用qsort时传了它俩(arr、sizeof(arr[0]))比较元素的地址就有了
////不管什么类型的统一传过去传给char*接收配合类型字节大小同样都能模拟出那种类型的有解引用权限的地址
////变量的大小单位是字节，大小字节单位的数字量与char*来相加减刚刚好
//    printf_arr(arr,sz);
//}
//
//
//
////text(5)按结构体数组里的名字排序结构体数组
//struct stu
//{
//	char name[20];
//	int age;
//};
////比较字符数组的小雏形函数
//int small_compare_name(const void*p1, const void*p2)
//{
//	return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);
//}
//void text5()
//{
//	struct stu arr[] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
//	int num = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr, sizeof(arr[0]), num, small_compare_name);
//}
//int main()
//{
//    text4();
//    text5();
//    return 0;
//}